home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / comm / tcp / rxsocket.lha / rxsocket / examples / amisearch.rexx < prev    next >
OS/2 REXX Batch file  |  2000-11-28  |  4KB  |  180 lines

  1. /* */
  2.  
  3. signal on break_c
  4. signal on syntax
  5. Pname="AmiSearch/4.5"
  6. PRG="AmiSearch"
  7.  
  8. l="rmh.library";if ~show("L",l) then;if ~addlib(l,0,-30) then exit
  9. if AddLibrary("rexxsupport.library","rxsocket.library")~=0 then exit
  10.  
  11. /* open stderr for clean output */
  12. if ~Open("STDERR","CONSOLE:","W") then STDERR = "STDOUT"
  13.  
  14. onAmirc=left(address(),6)=="AMIRC."
  15. TEMPLATE="KEY,TIMEOUT/N,MAXLEN/K/N,SAY/S,HOST/K,URL/S,QUIET/S,BREAK/K/N"
  16. if onAmirc & arg()==1 & arg(1)=="?" then call err TEMPLATE
  17.  
  18. /* parse arguments */
  19. parm.5.value = "ftp.uni-paderborn.de"
  20. if ~RMH_ReadArgs(TEMPLATE) then do
  21.     msg=fault(,PRG)
  22.     parse var msg d": " msg
  23.     call err msg
  24. end
  25.  
  26. if parm.7.flag then do
  27.     PRG="AmsBreak"
  28.     task=GetClip("AmiSearch."parm.7.value)
  29.     if task~="" then call Signal(x2d(task),2**12)
  30.     if task~="" then call info "AmiSearch."parm.7.value "broken."
  31.     else call info "AmiSearch."parm.7.value "not found."
  32.     exit
  33. end
  34. else if ~parm.0.flag then call err DosString(116)
  35.  
  36. if ~IsLibOn("SOCKET") then call err "no TCP/IP stack running."
  37.  
  38. do id=0 while GetClip("AmiSearch."id)~="";end;
  39. call SetClip("AmiSearch."id,pragma("ID"))
  40.  
  41. if parm.2.flag then max=parm.2.value
  42. else max=80
  43.  
  44. msg="-----"PRG"."id": '"parm.0.value"' -----"
  45. msgl=length(msg)
  46. call info msg,1
  47.  
  48. /* lookup host */
  49. if ~parm.6.flag then call info "resolving host..."
  50. host="ftp.uni-paderborn.de"
  51. addr=resolve(host)
  52. if addr==-1 then call err "can't lookup host <"host">."
  53.  
  54. /* create a socket */
  55. sock = socket("INET","STREAM")
  56. if sock<0 then call err "can't create my socket."
  57.  
  58. /* remote */
  59. sin.addrFamily = "INET"
  60. sin.addrPort   = 80
  61. sin.addrAddr   = addr
  62.  
  63. /* timeout? */
  64. if parm.1.flag then do
  65.     if parm.1.value<=0 then call err "timeout must be greater than 0."
  66.     tim=CreateTimer()
  67.     ts=TimerSignal(tim)
  68.     call SetSocketSignals(or(ts,2**12))
  69.     call StartTimer(tim,parm.1.value)
  70. end
  71.  
  72. /* connect */
  73. if ~parm.6.flag then call info "connecting..."
  74. if connect(sock,"SIN")<0 then call err "can't connect."
  75.  
  76. /* request to send*/
  77. eol="D0A"x
  78. if ~parm.6.flag then call info "sending request..."
  79. req= "GET /aminetbin/find?"parm.0.value "HTTP/1.0"eol,
  80. "User-Agent:" Pname "(AmigaOS ARexx rxsocket.library)"eol||eol
  81. if send(sock,req)~=length(req) then call err "send error."
  82.  
  83. /* request result */
  84. if ~parm.6.flag then call info "receiving result..."
  85. len=recvline(sock,"BUF")
  86. if len<0 then do
  87.     call err "recv error."
  88.     exit
  89. end
  90. if left(buf,5)~="HTTP/" then do
  91.     call err "bad answer from server."
  92.     exit
  93. end
  94. parse var buf "HTTP/"ver code rest"D0A"x
  95. if code~=200 then do
  96.     call err "server returns an error:"rest "("code")."
  97.     exit
  98. end
  99.  
  100. /* skip head */
  101. go=1
  102. do while go
  103.     len=RecvLine(sock,"BUF")
  104.     if len<0 then call err "recv error."
  105.     parse var buf b": "rest"D0A"x
  106.     go=(buf~=eol)
  107. end
  108.  
  109. /* wait for results */
  110. if ~parm.6.flag then call info copies("-",msgl),1
  111. go=1
  112. do while go
  113.     len=RecvLine(sock,"BUF",256)
  114.     if len<0 then call err "recv error."
  115.     go=(pos("files matching",buf)=0)
  116. end
  117.  
  118. res=word(buf,1)
  119. if res=0 then call err "no match found."
  120. else call info res "file(s) found",1
  121.  
  122. call info left("Name",30) left("Size",5) left("Age",3) "Comment",1
  123. go=1
  124. do forever
  125.     len=recvline(sock,"BUF",1024)
  126.  
  127.     if len<0 then call err "recv error."
  128.     if len=0 then leave
  129.  
  130.     if pos("<a href",buf)~=1 then
  131.         if pos("<hr><a href",buf)~=1 then iterate
  132.  
  133.     parse var buf "a href="u">"file"</a>" path size week "<a href="dummy">" comment "<"
  134.     parse var comment comment "A"x
  135.     if parm.5.flag then do
  136.         if parm.4.flag then u=addpart(parm.4.value,addpart(path,file))
  137.     end
  138.     else u = left(AddPart(path,file),30)
  139.     msg=u left(space(size),5) left(space(week),3) comment
  140.     call info msg,1
  141. end
  142. call info copies("-",msgl),1
  143. call delClip
  144. exit
  145.  
  146. info:
  147. parse arg msg,s
  148.     if onAmirc then
  149.         if s=1 & parm.3.flag then "SAY" msg
  150.         else "ECHO P=" || "1B"x || "b«"PRG"» C=6" msg
  151.     else say PRG":" msg
  152.     return
  153.  
  154. /* print error to stderr */
  155. err:
  156. parse arg msg
  157.     call delClip
  158.     if IsLibOn("SOCKET") then if errno()==4 then msg="timeout"
  159.     if onAmirc then "ECHO P=" || "1B"x || "b«"PRG"» C=6" msg
  160.     else call Writeln(STDERR,PRG":" msg)
  161.     exit
  162.  
  163. /* controll user break */
  164. break_c:
  165.     set.errno=0
  166.     call SetSocketBase("SET")
  167.     call err "user break."
  168.  
  169. syntax:
  170.     msg="Error" ErrorText(rc) "in line" sigl
  171.     if onAmirc then "ECHO P=" || "1B"x || "b«"PRG"» C=6" msg
  172.     else call Writeln(STDERR,PRG":" msg)
  173.     exit
  174.  
  175. delClip:
  176.     call SetClip("AmiSearch."id)
  177.     return
  178.  
  179. /*$VER: AmiSearch.rexx 4.5 (15.5.99)*/
  180.